import java.sql.*;

import java.sql.*;
import java.util.Scanner;

//测试 jdbc
			/*总结:
			    作用: java程序和数据库连接的技术
			    SQL注入攻击问题:拼接SQL时,出现了特殊符号#,只需要输入用户名而不需要密码都可以登录
			    SQL注入攻击解决方案:不用Statement,换成了PreparedStatement,
			            新的工具类的好处:不用自己拼SQl的字符串了,安全,高效
			    PreparedStatement的解决过程:先把SQL骨架发给数据库,数据库进行预编译
			            等到设置好了参数,再和骨架一起执行,避免了人为的恶意的拼串造成的隐患
			 */
public class Test2 {
    public static void main(String[] args) {
//                method();
//                login();//SQL注入攻击问题
//        login2();//解决SQL注入攻击的方案
        login3();//解决资源关闭异常
    }
    //解决SQL注入攻击的方案
    private static void login2() {
        try{
            Class.forName("com.mysql.jdbc.Driver");
            String url="jdbc:mysql:///test2104?characterEncoding=utf8";
            Connection conn = DriverManager.getConnection(url, "root", "root");
            //            Statement st = conn.createStatement();不行,不安全,会被SQL攻击

            String user = new Scanner(System.in).nextLine();//jack'#
            String pwd = new Scanner(System.in).nextLine();
            //?叫占位符 ,SQL的骨架
            String sql ="select * from user2 where name=? and password=?";
            //先把SQL骨架发给数据库执行
            PreparedStatement ps = conn.prepareStatement(sql);
            //给SQL里的? 设置参数
            ps.setString(1,user);
            ps.setString(2,pwd);
            ResultSet rs = ps.executeQuery();//执行查询的SQL,返回结果集

            if(rs.next()){
                System.out.println("登录成功~");
            }else{
                System.out.println("登录失败~");
            }
            ps.close();
            conn.close();
        }catch(Exception e){
            e.printStackTrace();//有异常,直接打印异常信息
            //System.out.println("执行失败。。。");//上线
        }
    }

    /*自己准备user2表(id/name/password),准备数据
        CREATE TABLE `user2` (
              `id` int(11)  PRIMARY KEY  auto_increment,
              `name` varchar(10) default NULL,
              `password` varchar(10) default NULL
        ) ;
     */
    //需求：利用jdbc,根据用户名和密码查询test2104库里的user表
    //SQL注入攻击问题
    private static void login() {
        try{
            Class.forName("com.mysql.jdbc.Driver");
            String url="jdbc:mysql:///test2104?characterEncoding=utf8";
            Connection conn = DriverManager.getConnection(url, "root", "root");
            Statement st = conn.createStatement();
            // String sql ="select * from user2 where name='jack' and password='123456'";//写死了

            String user = new Scanner(System.in).nextLine();//jack'#
            String pwd = new Scanner(System.in).nextLine();
            //SQL注入攻击问题：本质上是因为SQL语句中出现了特殊符号#,改变了SQL语义
            String sql ="select * from user2 where name='"+user+"' and password='"+pwd+"'";
            ResultSet rs = st.executeQuery(sql);//执行查询的SQL,返回结果集
            if(rs.next()){
                System.out.println("登录成功~");
            }else{
                System.out.println("登录失败~");
            }
            st.close();
            conn.close();
        }catch(Exception e){
            e.printStackTrace();//有异常,直接打印异常信息
            //System.out.println("执行失败。。。");//上线
        }

    }
    //需求：test2104库里的dept表里插入数据
    private static void method() {
        try{
            Class.forName("com.mysql.jdbc.Driver");
            String url="jdbc:mysql:///test2104?characterEncoding=utf8";
            Connection conn = DriverManager.getConnection(url, "root", "root");
            Statement st = conn.createStatement();

            //          ResultSet rs = st.executeQuery();//执行查询的SQL,返回结果集
            //int rows = st.executeUpdate();//执行增删改的SQL,返回影响行数
            int rows = st.executeUpdate("insert into dept values(null,'php开发部','北京')");
            System.out.println(rows);//打印影响的行数

            st.close();
            conn.close();
        }catch(Exception e){
            e.printStackTrace();//有异常,直接打印异常信息
            //System.out.println("执行失败。。。");//上线
        }
    }
    //解决资源关闭异常
    private static void login3(){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url="jdbc:mysql:///test2104?characterEncoding=utf8";
            conn = DriverManager.getConnection(url, "root", "root");
            String user = new Scanner(System.in).nextLine();//jack'#
            String pwd = new Scanner(System.in).nextLine();
            //?叫占位符 ,SQL的骨架
            String sql ="select * from user2 where name=? and password=?";
            //先把SQL骨架发给数据库执行
            ps = conn.prepareStatement(sql);
            //给SQL里的? 设置参数
            ps.setString(1,user);
            ps.setString(2,pwd);
            rs = ps.executeQuery();//执行查询的SQL,返回结果集
            if(rs.next()){
                System.out.println("登录成功~");
            }else{
                System.out.println("登录失败~");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtill.close(rs,ps,conn);//将处理异常封装成类

        }
    }
}
